namespace indexQianm {

    // 在TS中索引签名分为对象 类 数组 三种


    // 在对象的索引签名中，索引签名用来约束对象的新增属性
    interface ISchool {
        name: string
        address: string
        age: number

        [PropName: string]: string | number
    }

    class SSchool {
// 在类中的索引签名中，索引签名用来约束类的属性。其在类中的索引签名声明类的属性都要满足
        [s: string]: string | number | ((s: string) => boolean)

        name: string
        age: number

        constructor(name: string, age: number) {
            this.name = name;
            this.age = age;
        }

        getSchool() {
            return true
        }
    }

    // 在数组中的索引签名中，索引签名用来约束数组的元素 但声明数组的索引类型number其数组所在的属性都不可用
    //因为这只是声明一个类数组而已

    interface IArr {
        length: number

        join(separator?: string): string

        [index: number]: string
    }

    let arr: IArr = ['1', '2', '3']
    console.log(arr.length)
    console.log(arr.join(","))
}

